/**
 * @function 给定一个数组，根据数组的某一属性排序
 * @author LinHan
 * @param array 需要排序的数组对象
 * @param key 以什么字段排序
 */
export const arraySortByKey = <T, K extends keyof T>(array: T[], key: keyof K) => {
  return array.sort((a, b) => {
    const k1 = a[key as K]
    const k2 = b[key as K]
    if (k1 < k2) {
      return -1
    } else if (k1 > k2) {
      return 1
    } else {
      return 0
    }
  })
}

/**
 * @function 给定一个数组，根据数组的某一属性去重
 * @author LinHan
 * @param array 要去重的数组
 * @param prop 属性值
 * @param callback 回调函数
 * @returns 去重后的数组
 */
export const uniqueByProperty = <T, K extends keyof T>(array: T[], prop: K, callback?: (args?: T[]) => void) => {
  const map = new Map()
  array.forEach((item) => map.set(item[prop], item))

  const result = Array.from(map.values())

  return callback ? callback(result) : result
}

/**
 * @function 给定一个对象数组，根据指定的属性进行模糊匹配，并返回匹配到的对象
 * @author LinHan
 * @param array 要去重的数组
 * @param prop 属性值
 * @param key 模糊字符串
 * @param callback 回调函数
 * @returns 匹配到的对象
 */
export const fuzzyMatchByProperty =
  <T, K extends keyof T>(array: T[], prop: string, key: string, callback?: (arg?: T[]) => void) => {
    const reg = new RegExp(key.split('').join('.*'), 'g')
    const fuzzyMatch = array.filter((item) => {
      return reg.test(item[prop]) ?? item[prop].includes(key)
    }) as T[]
    return callback ? callback(fuzzyMatch) : fuzzyMatch
  }